﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIGEB.Modelo.moduloDocumentos;
using SIGEB.Modelo.moduloPerfiles;
using SIGEB.Modelo.moduloUsuarios;

namespace SIGEB.Prototipo.Control
{
    public class controlReservas
    {
        #region "constructores"

        public controlReservas(controlPrincipal cp)
        {
            this.cp = cp;
        }

        #endregion

        #region "validacioens'

        internal bool camposReservaValidos(reserva nueva)
        {
            return usuarioDocValido(nueva.idUsuario, nueva.idDocumento);
        }

        internal bool usuarioDocValido(string idUsuario, string idDocumento)
        {
            LinkedList<reserva> todas = cp.datos.reservas.obtenerReservas();
            foreach (reserva act in todas)
            {
                if (act.idDocumento == idDocumento && act.idUsuario == idUsuario)
                {
                    return false;
                }
            }
            return true;
        }

        #endregion

        #region "metodos"

        internal void crearReserva(reserva nueva)
        {
            if (!camposReservaValidos(nueva))
            {
                throw new Exception("Datos de la reserva son invalidos");
            }
            if (!cp.usuarioActualPuede(acciones.RESERVA_AGREGAR_TOD))
            {
                if (cp.usuarioActualPuede(acciones.RESERVA_AGREGAR_ACT) && nueva.idUsuario == cp.UsuarioActual)
                {
                    cp.datos.reservas.agregarReserva(nueva);
                    return;
                }
                else
                {
                    cp.ExcepcionUsrSinPermisos();
                }
            }
            cp.datos.reservas.agregarReserva(nueva);
        }

        internal void eliminarReserva(string cod)
        {
            reserva nueva = cp.datos.reservas.obtenerreserva(cod);
            if (nueva != null)
            {
                if (!cp.usuarioActualPuede(acciones.RESERVA_ELIMINAR_TOD))
                {
                    if (cp.usuarioActualPuede(acciones.RESERVA_ELIMINAR_ACT) && nueva.idUsuario == cp.UsuarioActual)
                    {
                        cp.datos.reservas.eliminarReserva(cod);
                        return;
                    }
                    else
                    {
                        cp.ExcepcionUsrSinPermisos();
                    }
                }
                cp.datos.reservas.eliminarReserva(cod);
            }
        }

        internal LinkedList<reserva> reservasPorUsuario(string idUsuario)
        {
            if (!cp.usuarioActualPuede(acciones.RESERVA_CONSULTAR_TOD))
            {
                if (cp.usuarioActualPuede(acciones.RESERVA_CONSULTAR_ACT) && cp.UsuarioActual == idUsuario)
                {
                    return cp.datos.reservas.obtenerreservaUsuario(idUsuario);  
                }
                else
                {
                    return new LinkedList<reserva>();
                }
            }
            return cp.datos.reservas.obtenerreservaUsuario(idUsuario);
        }

        internal LinkedList<reserva> consultarReservas()
        {
            if (!cp.usuarioActualPuede(acciones.RESERVA_CONSULTAR_TOD))
            {
                return new LinkedList<reserva>();
            }
            LinkedList<reserva> todas = cp.datos.reservas.obtenerReservas();
            return todas;
        }

        internal void eliminarReservaExistente(String idUsuario, String idDocumento)
        {
            if (!cp.usuarioActualPuede(acciones.RESERVA_ELIMINAR_TOD))
            {
                cp.ExcepcionUsrSinPermisos();
            }
            cp.datos.reservas.eliminarReserva(idUsuario, idDocumento);
        }

        internal LinkedList<usuario> obtenerUsuarios()
        {
            LinkedList<usuario> nueva = new LinkedList<usuario>();
            if (cp.usuarioActualPuede(acciones.RESERVA_CONSULTAR_TOD))
            {
                return cp.datos.usuarios.obtenerTodos();
            }
            else if (cp.usuarioActualPuede(acciones.RESERVA_CONSULTAR_ACT))
            {
                nueva.AddLast(cp.usuarioActual());
            }
            return nueva;
        }

        #endregion

        #region "atributos"

        controlPrincipal cp;

        #endregion

        internal static reserva buscarReservas(LinkedList<reserva> reservasActuales, string cod)
        {
            if (reservasActuales != null && !string.IsNullOrEmpty(cod))
            {
                foreach (reserva act in reservasActuales)
                {
                    if (act.idReserva == cod)
                    {
                        return act;
                    }
                }
            }
            return null;
        }
    }
}
